/****************************************************************************/

/*Portion I: Definitions  shared between VBIOS and Driver                   */

/****************************************************************************/

#ifndef _SHORT_ATOMBIOS_H
#define _SHORT_ATOMBIOS_H

#define ATOM_VERSION_MAJOR                   0x00020000
#define ATOM_VERSION_MINOR                   0x00000002

#define ATOM_HEADER_VERSION (ATOM_VERSION_MAJOR | ATOM_VERSION_MINOR)

#pragma pack(1) /* BIOS data must use byte aligment */

/*  Define offset to location of ROM header. */

#define OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER		0x00000048L
#define OFFSET_TO_ATOM_ROM_IMAGE_SIZE				    0x00000002L

typedef struct _ATOM_COMMON_TABLE_HEADER {
  UINT16 usStructureSize;
  UINT8 ucTableFormatRevision;  /*Change it when the Parser is not backward compatible */
  UINT8 ucTableContentRevision; /*Change it only when the table needs to change but the firmware */
  /*Image can't be updated, while Driver needs to carry the new table! */
} ATOM_COMMON_TABLE_HEADER;

typedef struct _ATOM_ROM_HEADER {
  ATOM_COMMON_TABLE_HEADER sHeader;
  UINT8 uaFirmWareSignature[4]; /*Signature to distinguish between Atombios and non-atombios, 
                                   +                                      atombios should init it as "ATOM", don't change the position */
  UINT16 usBiosRuntimeSegmentAddress;
  UINT16 usProtectedModeInfoOffset;
  UINT16 usConfigFilenameOffset;
  UINT16 usCRC_BlockOffset;
  UINT16 usBIOS_BootupMessageOffset;
  UINT16 usInt10Offset;
  UINT16 usPciBusDevInitCode;
  UINT16 usIoBaseAddress;
  UINT16 usSubsystemVendorID;
  UINT16 usSubsystemID;
  UINT16 usPCI_InfoOffset;
  UINT16 usMasterCommandTableOffset;  /*Offset for SW to get all command table offsets, Don't change the position */
  UINT16 usMasterDataTableOffset; /*Offset for SW to get all data table offsets, Don't change the position */
  UINT8 ucExtendedFunctionCode;
  UINT8 ucReserved;
} ATOM_ROM_HEADER;

/****************************************************************************/
// Structure used in Data.mtb

/****************************************************************************/
typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES {
  UINT16 UtilityPipeLine;       // Offest for the utility to get parser info,Don't change this position!
  UINT16 MultimediaCapabilityInfo;  // Only used by MM Lib,latest version 1.1, not configuable from Bios, need to include the table to build Bios 
  UINT16 MultimediaConfigInfo;  // Only used by MM Lib,latest version 2.1, not configuable from Bios, need to include the table to build Bios
  UINT16 StandardVESA_Timing;   // Only used by Bios
  UINT16 FirmwareInfo;          // Shared by various SW components,latest version 1.4
  UINT16 DAC_Info;              // Will be obsolete from R600
  UINT16 LVDS_Info;             // Shared by various SW components,latest version 1.1 
  UINT16 TMDS_Info;             // Will be obsolete from R600
  UINT16 AnalogTV_Info;         // Shared by various SW components,latest version 1.1 
  UINT16 SupportedDevicesInfo;  // Will be obsolete from R600
  UINT16 GPIO_I2C_Info;         // Shared by various SW components,latest version 1.2 will be used from R600           
  UINT16 VRAM_UsageByFirmware;  // Shared by various SW components,latest version 1.3 will be used from R600
  UINT16 GPIO_Pin_LUT;          // Shared by various SW components,latest version 1.1
  UINT16 VESA_ToInternalModeLUT;  // Only used by Bios
  UINT16 ComponentVideoInfo;    // Shared by various SW components,latest version 2.1 will be used from R600
  UINT16 PowerPlayInfo;         // Shared by various SW components,latest version 2.1,new design from R600
  UINT16 CompassionateData;     // Will be obsolete from R600
  UINT16 SaveRestoreInfo;       // Only used by Bios
  UINT16 PPLL_SS_Info;          // Shared by various SW components,latest version 1.2, used to call SS_Info, change to new name because of int ASIC SS info
  UINT16 OemInfo;               // Defined and used by external SW, should be obsolete soon
  UINT16 XTMDS_Info;            // Will be obsolete from R600
  UINT16 MclkSS_Info;           // Shared by various SW components,latest version 1.1, only enabled when ext SS chip is used
  UINT16 Object_Header;         // Shared by various SW components,latest version 1.1
  UINT16 IndirectIOAccess;      // Only used by Bios,this table position can't change at all!!
  UINT16 MC_InitParameter;      // Only used by command table
  UINT16 ASIC_VDDC_Info;        // Will be obsolete from R600
  UINT16 ASIC_InternalSS_Info;  // New tabel name from R600, used to be called "ASIC_MVDDC_Info"
  UINT16 TV_VideoMode;          // Only used by command table
  UINT16 VRAM_Info;             // Only used by command table, latest version 1.3
  UINT16 MemoryTrainingInfo;    // Used for VBIOS and Diag utility for memory training purpose since R600. the new table rev start from 2.1
  UINT16 IntegratedSystemInfo;  // Shared by various SW components
  UINT16 ASIC_ProfilingInfo;    // New table name from R600, used to be called "ASIC_VDDCI_Info" for pre-R600
  UINT16 VoltageObjectInfo;     // Shared by various SW components, latest version 1.1
  UINT16 PowerSourceInfo;       // Shared by various SW components, latest versoin 1.1
} ATOM_MASTER_LIST_OF_DATA_TABLES;

typedef struct _ATOM_MASTER_DATA_TABLE {
  ATOM_COMMON_TABLE_HEADER sHeader;
  ATOM_MASTER_LIST_OF_DATA_TABLES ListOfDataTables;
} ATOM_MASTER_DATA_TABLE;

typedef union _ATOM_MODE_MISC_INFO_ACCESS {
  UINT16 usAccess;
} ATOM_MODE_MISC_INFO_ACCESS;

/****************************************************************************/
// Structure used in StandardVESA_TimingTable
//                   AnalogTV_InfoTable 
//                   ComponentVideoInfoTable

/****************************************************************************/
typedef struct _ATOM_MODE_TIMING {
  UINT16 usCRTC_H_Total;
  UINT16 usCRTC_H_Disp;
  UINT16 usCRTC_H_SyncStart;
  UINT16 usCRTC_H_SyncWidth;
  UINT16 usCRTC_V_Total;
  UINT16 usCRTC_V_Disp;
  UINT16 usCRTC_V_SyncStart;
  UINT16 usCRTC_V_SyncWidth;
  UINT16 usPixelClock;          //in 10Khz unit
  ATOM_MODE_MISC_INFO_ACCESS susModeMiscInfo;
  UINT16 usCRTC_OverscanRight;
  UINT16 usCRTC_OverscanLeft;
  UINT16 usCRTC_OverscanBottom;
  UINT16 usCRTC_OverscanTop;
  UINT16 usReserve;
  UINT8 ucInternalModeNumber;
  UINT8 ucRefreshRate;
} ATOM_MODE_TIMING;

typedef struct _ATOM_DTD_FORMAT {
  UINT16 usPixClk;
  UINT16 usHActive;
  UINT16 usHBlanking_Time;
  UINT16 usVActive;
  UINT16 usVBlanking_Time;
  UINT16 usHSyncOffset;
  UINT16 usHSyncWidth;
  UINT16 usVSyncOffset;
  UINT16 usVSyncWidth;
  UINT16 usImageHSize;
  UINT16 usImageVSize;
  UINT8 ucHBorder;
  UINT8 ucVBorder;
  ATOM_MODE_MISC_INFO_ACCESS susModeMiscInfo;
  UINT8 ucInternalModeNumber;
  UINT8 ucRefreshRate;
} ATOM_DTD_FORMAT;

typedef struct _ATOM_LVDS_INFO_V12 {
  ATOM_COMMON_TABLE_HEADER sHeader;
  ATOM_DTD_FORMAT sLCDTiming;
  UINT16 usExtInfoTableOffset;
  UINT16 usSupportedRefreshRate;  //Refer to panel info table in ATOMBIOS extension Spec.
  UINT16 usOffDelayInMs;
  UINT8 ucPowerSequenceDigOntoDEin10Ms;
  UINT8 ucPowerSequenceDEtoBLOnin10Ms;
  UINT8 ucLVDS_Misc;            // Bit0:{=0:single, =1:dual},Bit1 {=0:666RGB, =1:888RGB},Bit2:3:{Grey level}
  // Bit4:{=0:LDI format for RGB888, =1 FPDI format for RGB888}
  // Bit5:{=0:Spatial Dithering disabled;1 Spatial Dithering enabled}
  // Bit6:{=0:Temporal Dithering disabled;1 Temporal Dithering enabled}
  UINT8 ucPanelDefaultRefreshRate;
  UINT8 ucPanelIdentification;
  UINT8 ucSS_Id;
  UINT16 usLCDVenderID;
  UINT16 usLCDProductID;
  UINT8 ucLCDPanel_SpecialHandlingCap;
  UINT8 ucPanelInfoSize;        //  start from ATOM_DTD_FORMAT to end of panel info, include ExtInfoTable
  UINT8 ucReserved[2];
} ATOM_LVDS_INFO_V12;

typedef struct _ATOM_STANDARD_VESA_TIMING {
  ATOM_COMMON_TABLE_HEADER sHeader;
  char *aModeTimings;           // 16 is not the real array number, just for initial allocation
} ATOM_STANDARD_VESA_TIMING;

#pragma pack()

#endif
